iT邦幫忙

2021 iThome 鐵人賽

DAY 26
1
Software Development

從 JavaScript 角度學 Python系列 第 26

從 JavaScript 角度學 Python(26) - 指定直譯器

  • 分享至 

  • xImage
  •  

前言

這一章節開始讓自己腦袋輕鬆一點好了,畢竟前面也學了不少的東西,所以這邊就聊點簡單的好了。

指定直譯器

你有注意到許多 Python 的程式碼前面都會有一行神奇的語法,例如:

#!/usr/bin/python
#!/usr/bin/env python
#!/usr/bin/python3
#!/usr/bin/env python3

那麼這幾行到底是什麼意思呢?

https://ithelp.ithome.com.tw/upload/images/20210926/20119486jPGWhzaquM.png

簡單來講就是在指定 Python 直譯器而已。

這時候你可能會想說為什麼還要特別去指定 Python 的直譯器呢?這個原因是因為有些人在開發的時候電腦會同時安裝 Python2 與 Python3,例如:我。

而 Python2 與 Python3 不論是套件或者是語法上都是不相容的,在前面章節其實都有加減舉例到一些 Python2 與 Python3 兩者寫法上的差異,所以應該都可以注意到語法上的不同。

#! 這個語法其實被稱為 Shebang 或者是 Hashbang,主要是用於指定直譯器的類型,雖然在解釋上是說指定直譯器的類型,但實際上是在指定直譯器的執行檔案位置,因此其實不只有 Python 會用到,就連 PHP 也會有機會看到:

#!/usr/bin/php

而這一行指令主要用於「類 Unix」系統,而類 Unix 意思是指各種 Unix 延伸出來的版本,但這不是這一章節想聊的東西,如果想更了解什麼是「類 Unix」的話,會建議閱讀維基百科 這一篇 的解釋。

那麼我們該如何驗證這一行真的有效呢?如果你是 Mac 開發者的話,恭喜你!你可以試著實驗看看,但是如果你是 Window 開發者的話就只能跟你說一聲 Sorry 了,畢竟 Windows 不支援 Shebang。

https://ithelp.ithome.com.tw/upload/images/20210926/201194861fGLxM3iRw.png

透過前面迷因的解釋,我們就知道接下來完全不會圍繞在 Windows 上,所以這邊就只會圍繞在 Mac 解釋,那為什麼要特別指定直譯器呢?在安裝的章節我們有解釋過 Mac 本身就有內建 Python 2.x,如果你要使用 Python3.x 的話,通常會需要額外安裝。

講到這邊你發現了嗎?我們一台 Mac 中會有兩個版本的 Python 呢!雖然我們在前面都沒有什麼太大執行上的狀況,因為我們有特別指定使用 python3 指令去跑 Python 檔案,如果拿到 Node.js 來講的話...這個概念類似於我們在執行 Node.js 的時候,通常都會輸入 node app.js 的概念一樣,然後假設某一天 Node.js 大改版,以後指令預設安裝之後你必須輸入 node3 app.js 是雷同的想法。

這時候你可能會想說「那這樣我還要寫 #!/usr/bin/python3 嗎?」答案還是建議要寫,除了可以確保 Python 檔案在雙系統(Python2 與 Python3) 的 Unix 可以正常運作之外,你也可以透過這一行就知道這個檔案所要運行的是 Python2 還是 Python3 唷。

#!/usr/bin/python3#!/usr/bin/env python3 也是有一定差異的,有些開發者在安裝環境的時候,並不會將 python 安裝在預設 /usr/bin 路徑下,因此為了避免這種狀況發生,通常就會使用 /usr/bin/env,當使用者沒有將 Python 安裝在預設路徑時,就會改讀取 env 路徑去找 Python 直譯器,所以你說哪一種比較好?以我的認知來講是推薦使用 /usr/bin/env 哩。

oh!對了,除了 #!/usr/bin/python3 指定直譯器的方式之外,還有指定原始碼的字元編碼,雖然 Python 通常預設字元編碼是 UTF-8(又稱之為萬國碼),但是總會有另外狀況,所以當你希望調整字元編碼時只需要在檔案前面寫你要的字元編碼即可:

#!/usr/bin/env python
# -*- coding: big5 -*-

但是通常來講保持 UTF-8 是比較好,因此你也會看到有人為了避免一些怪狀況,所以都會寫死就是了:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

這時候你可能會想說,為什麼我都沒有去撰寫這個指定直譯器的方式呢?原因很簡單,我忘了。

https://ithelp.ithome.com.tw/upload/images/20210926/20119486vvVU0Rhab8.png

好啦,時間也差不多了,這邊算是簡單輕鬆聊一下這個而已,那麼我們下一篇見囉~

參考文獻

作者的話

都市地區住習慣之後再回到鄉下住整個簡直快崩潰一樣,因為一直沒有訊號,超怕一個不小心鐵人賽就沒有發出去 QQ

關於兔兔們

兔法無邊


上一篇
從 JavaScript 角度學 Python(25) - 例外處理
下一篇
從 JavaScript 角度學 Python(27) - 傳值?傳參考?
系列文
從 JavaScript 角度學 Python31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言